/*************************************************************************
Programme de gestion d'écriture des logs dans un fichier
*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

//variables globales
char * LOGFILENAME; //nom du fichier de log
char * CALLERNAME;	//nom du caller
FILE * LOGFILE; //fichier de log

//état des logs
//	0 lorsque ce n'est pas initialisé
//	1 lorsque que c'est bien initialisé
//	2 lorsque le fichier est bien initialisé mais pas le nom du caller
long LOGSTATE = 0;

/**
*	fonction d'ecriture de log
*	ecrit dans le fichier de log s'il est initialisé
*/
void WriteLog(char * pcMessage_i){

	//si on est mal ou pas initialisé, on n'écrit rien
	if (LOGSTATE != 0){
		//récupération de la date et heure
		char buffer[512];
		time_t timestamp = time(NULL);
		strftime(buffer, sizeof(buffer), "%x - %X.", localtime(&timestamp));
	
		//écriture dans le fichier
		fprintf(LOGFILE, "%s %s %s\n", CALLERNAME, buffer, pcMessage_i);
	}
}

/**
*	fonction d'initialisation du fichier de log
*	crée le fichier de log s'il n'existe pas
*
*		return 1 lorsque c'est bien initialisé
*		return 0 lorsqu'il y a eu un problème et que rien ne fonctionne
*		return 2 lorsque c'est bien initialisé sans le caller name
*/
long InitLogs(char * pcLogFileName_i, char * pcCallerName_i){
	//récupération de la taile du nom de fichier
	long lFileNameSize = strlen(pcLogFileName_i)*sizeof(char);
	
	//test si le nom de fichier est correct
	if (lFileNameSize != 0){
		//définition de la variable globale LOGFILENAME
		LOGFILENAME = malloc(lFileNameSize);
		strcpy(LOGFILENAME,pcLogFileName_i);
		
		//définition de la variable globale LOGFILE, ouverture en ajout d'écriture
		LOGFILE = fopen(LOGFILENAME, "w");
		if (LOGFILE == NULL) {
			perror("Impossible d'ouvrir ou créer le fichier de log");
			//maj de la valeur de LOGSTATE
			LOGSTATE = 0;
		}
		
		//maj de la valeur de LOGSTATE si tout c'est bien passé
		LOGSTATE = 1;
	}
	else {
		perror("Attention, impossible d'initialiser les logs : le nom du fichier de log est invalide");
		//maj de la valeur de LOGSTATE
		LOGSTATE = 0;
	}
	
	if (LOGSTATE == 1){
		//récupération de la taile du nom de caller
		long lCallerNameSize = strlen(pcCallerName_i)*sizeof(char);
	
		//test si le nom de caller est correct
		if (lCallerNameSize != 0){
			//définition de la variable globale CALLERNAME
			CALLERNAME = malloc(lCallerNameSize);
			strcpy(CALLERNAME,pcCallerName_i);
		}
		else {
			perror("Attention, impossible d'initialiser le nom de caller");
			CALLERNAME = "";
			
			//maj de la valeur de LOGSTATE
			LOGSTATE = 2;
		}
	}
	
	//return final du LOGSTATE
	return LOGSTATE;
	
}

/**
*	fonction de fermeture du fichier de log
*/
long CloseLogs(){
	//fermeture du programme
	fclose(LOGFILE);
	//free
	free(LOGFILENAME);
	free(CALLERNAME);
	
	return 1;
}

